
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.capa.view.mbean;

import com.brain.capa.dto.AlumnoDto;
import com.brain.capa.dto.RequerimientoCapaDto;
import com.brain.capa.manager.AlumnoManager;
import com.brain.capa.manager.RequerimientoCapaManager;
import com.brain.capa.view.util.ConstantesCapa;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.view.mbean.*;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.util.ConstantesCore;
import com.brain.segu.dto.UsuarioDto;
import com.brain.sgc.dto.PersonaDto;
import com.brain.sgc.manager.PersonaManager;
import com.brain.sgc.view.mbean.PersonaMBean;
import com.brain.sgc.view.util.ConstantesSgc;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Hvives
 */
@Controller("requerimientoCapaMBean")
@Scope("session")
public class RequerimientoCapaMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(RequerimientoCapaMBean.class);
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private RequerimientoCapaManager manager;
    @Resource
    private PersonaManager personaManager;
    @Resource
    private AlumnoManager alumnoManager;
    private List<RequerimientoCapaDto> lista;
    private RequerimientoCapaDto dto;
    private AlumnoDto alumnoDto;
    private RequerimientoCapaDto dtoFiltro;
    private String keyTitulo = "requerimiento.capa.panel";
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<ParametroDto> listaEstadosFiltro;
    private List<ParametroDto> listaEstados;
    private List<ParametroDto> listaAmbitos;
    private List<ParametroDto> listaArea;
    private List<ParametroDto> listaAmbitosFiltro;
    private List<PersonaDto>   listaEmpleados;
    private List<AlumnoDto>    listaAlumno;
    private UsuarioDto solicitanteDto;
    private PersonaDto[] selectedPersona;
    private Date fechaActual;
    
    private boolean accesoAnular;
    private boolean accesoAprobar;
    private boolean accesoRechazar;
    private boolean accesoGuardar;
    private boolean accesoInversion;

    public RequerimientoCapaMBean() {
        this.dtoFiltro = new RequerimientoCapaDto();
    }

    public String iniciar() {
        this.dto = null;
        this.lista = null;
        this.dtoFiltro = new RequerimientoCapaDto();
        return ConstantesCapa.UrlNavegacion.URL_LISTA_REQUERIMIENTOS;
    }

    public String nuevo() {
        sessionMBean.setAccion(ConstantesSgc.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dto = manager.inicializar();
        gestionAcceso();
        return ConstantesCapa.UrlNavegacion.URL_REQUERIMIENTO;
    }

    public String editar() {
        sessionMBean.setAccion(ConstantesSgc.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        gestionAcceso();
        return ConstantesCapa.UrlNavegacion.URL_REQUERIMIENTO;
    }

    public String ver() {
        sessionMBean.setAccion(ConstantesSgc.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        gestionAcceso();
        return ConstantesCapa.UrlNavegacion.URL_REQUERIMIENTO;
    }

    public void buscar(ActionEvent ae) {

        try {
            this.lista = this.manager.obtenerRequerimientosFiltro(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }

    }

    public String guardar() {
     try {   
            RequerimientoCapaDto dtoReqCap=this.dto;
            //RoiDto roiReq = new RoiDto();
            //roiReq.setId(0L);
            //this.dto.setRoiDto(roiReq);
            this.manager.guardar(this.dto);
            if(this.dto != null) {
                this.dto=this.manager.obtenerPorId(this.dto.getId());
                return editar();
            }else{this.dto=dtoReqCap;}
       } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
        return "";
    }

    public String retroceder() {
        buscar(null);
        sessionMBean.setAccion(ConstantesSgc.Formulario.LISTA);
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return ConstantesCapa.UrlNavegacion.URL_LISTA_REQUERIMIENTOS;
    }
    
    public String aprobar() {
        try{
            if(this.dto.getInversion()!=null){
             this.dto.setUsuarioEjecucion(sessionMBean.getSessionUsuarioDto().getId());
             this.dto.setFechaEjecucion(UtilCore.Fecha.obtenerFechaActualDate());
             this.dto.setEstadoDto(new ParametroDto(ConstantesCapa.Parametro.REQ_ESTADO_PROBADO));   
             this.manager.editar(this.dto);
             this.dto=this.manager.obtenerPorId(this.dto.getId());
             showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok"));
            }else{showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("requerimiento.mensaje.inversion.error"));}
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
         return editar();
    }
    
    public void anular() {
        this.dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
        this.dto.setEstadoDto(new ParametroDto(ConstantesCapa.Parametro.REQ_ESTADO_ANULADO));
        guardar(); 
    }
    public void rechazar() {
        this.dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
        this.dto.setEstadoDto(new ParametroDto(ConstantesCapa.Parametro.REQ_ESTADO_RECHAZADO));
        guardar(); 
    }
    
    public void gestionAcceso() {
        this.accesoAnular = false;
        this.accesoAprobar = false;
        this.accesoRechazar = false;
        this.accesoGuardar = true;
        this.accesoInversion = true;
        if (dto.getId() != null) {
            if (dto.getEstadoDto().getId().equals(ConstantesCapa.Parametro.REQ_ESTADO_ACTIVO)) {//Solicitado
                this.accesoAnular = false;
                this.accesoAprobar = true;
                this.accesoRechazar = true;
                this.accesoGuardar = true;
                this.accesoInversion = false;
            } else {
                this.accesoAnular = false;
                this.accesoAprobar = false;
                this.accesoRechazar = false;
                this.accesoGuardar = false;
                this.accesoInversion = false;
            }

            //Si la accion es = VER
            if (sessionMBean.getAccion() == 3) {
                this.accesoAnular = false;
                this.accesoAprobar = false;
                this.accesoRechazar = false;
                this.accesoGuardar = false;
                this.accesoInversion = false;
            }
        }
    }
    public void cargarPopupEmpleado() {
        PersonaMBean personaMBean = (PersonaMBean) WebServletContextListener.getApplicationContext().getBean("personaMBean");
        personaMBean.iniciar();
        personaMBean.setLista(new ArrayList<PersonaDto>());
    }
    protected void quitarEmpleadosSeleccionados() {
        List<PersonaDto> l = new ArrayList<PersonaDto>();
        for (PersonaDto e : this.listaEmpleados) {
            Boolean i = true;
            for (AlumnoDto pe : this.listaAlumno) {
                if (e.getId().equals(pe.getPersonaDto().getId())) {
                    i = false;
                }
            }
            if (i) {
                l.add(e);
            }
        }
        this.listaEmpleados = l;
    }
    
    public void handleSelect(SelectEvent event) {         
     //   System.out.print("persona ID -->"+this.dto.getPersonaDto().getId());
        try {
            this.dto.setAreaDto(this.dto.getSolicitanteDto().getPuestoDto().getAreaDto());
           
        } catch (Exception ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
       
    }
    
    public RequerimientoCapaManager getManager() {
        return manager;
    }

    public void setManager(RequerimientoCapaManager manager) {
        this.manager = manager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public List<RequerimientoCapaDto> getLista() {
        return lista;
    }

    public void setLista(List<RequerimientoCapaDto> lista) {
        this.lista = lista;
    }

    public RequerimientoCapaDto getDto() {
        return dto;
    }

    public void setDto(RequerimientoCapaDto dto) {
        this.dto = dto;
    }

    public RequerimientoCapaDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(RequerimientoCapaDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<ParametroDto> getListaEstadosFiltro() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesCapa.CatalogoParametro.REQ_ESTADOS, ConstantesCore.Parametro.TODOS);
    }

    public void setListaEstadosFiltro(List<ParametroDto> listaEstadosFiltro) {
        this.listaEstadosFiltro = listaEstadosFiltro;
    }

    public List<ParametroDto> getListaEstados() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesCapa.CatalogoParametro.REQ_ESTADOS);
    }
    
    public void setListaEstados(List<ParametroDto> listaEstados) {
        this.listaEstados = listaEstados;
    }

    public List<ParametroDto> getListaAmbitosFiltro() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesCapa.CatalogoParametro.REQ_AMBITOS, ConstantesCore.Parametro.TODOS);
    }

    public void setListaAmbitosFiltro(List<ParametroDto> listaAmbitosFiltro) {
        this.listaAmbitosFiltro = listaAmbitosFiltro;
    }

    public List<ParametroDto> getListaAmbitos() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesCapa.CatalogoParametro.REQ_AMBITOS);
    }

    public void setListaAmbitos(List<ParametroDto> listaAmbitos) {
        this.listaAmbitos = listaAmbitos;
    }  

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        RequerimientoCapaMBean.logger = logger;
    }

    public boolean isAccesoAnular() {
        return accesoAnular;
    }

    public void setAccesoAnular(boolean accesoAnular) {
        this.accesoAnular = accesoAnular;
    }

    public boolean isAccesoAprobar() {
        return accesoAprobar;
    }

    public void setAccesoAprobar(boolean accesoAprobar) {
        this.accesoAprobar = accesoAprobar;
    }

    public boolean isAccesoRechazar() {
        return accesoRechazar;
    }

    public void setAccesoRechazar(boolean accesoRechazar) {
        this.accesoRechazar = accesoRechazar;
    }

    public boolean isAccesoGuardar() {
        return accesoGuardar;
    }

    public void setAccesoGuardar(boolean accesoGuardar) {
        this.accesoGuardar = accesoGuardar;
    }

    public PersonaDto[] getSelectedPersona() {
        return selectedPersona;
    }

    public void setSelectedPersona(PersonaDto[] selectedPersona) {
        this.selectedPersona = selectedPersona;
    }

    public List<PersonaDto> getListaEmpleados() {
        return listaEmpleados;
    }

    public void setListaEmpleados(List<PersonaDto> listaEmpleados) {
        this.listaEmpleados = listaEmpleados;
    }

    public AlumnoDto getAlumnoDto() {
        return alumnoDto;
    }

    public void setAlumnoDto(AlumnoDto alumnoDto) {
        this.alumnoDto = alumnoDto;
    }

    public List<AlumnoDto> getListaAlumno() {
      /*  if (!listaAlumno.isEmpty()) {
            UtilCore.General.ordena(listaAlumno, "orden");
        }*/
        return listaAlumno;
    }

    public void setListaAlumno(List<AlumnoDto> listaAlumno) {
        this.listaAlumno = listaAlumno;
    }

    public UsuarioDto getSolicitanteDto() {
        return solicitanteDto;
    }

    public void setSolicitanteDto(UsuarioDto solicitanteDto) {
        this.solicitanteDto = solicitanteDto;
    }

    public Date getFechaActual() {
        return UtilCore.Fecha.obtenerFechaActualDate();
    }

    public void setFechaActual(Date fechaActual) {
        this.fechaActual = fechaActual;
    }

    public boolean isAccesoInversion() {
        return accesoInversion;
    }

    public void setAccesoInversion(boolean accesoInversion) {
        this.accesoInversion = accesoInversion;
    }

    public List<ParametroDto> getListaArea() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesSgc.CatalogoParametro.AREA);
    }

    public void setListaArea(List<ParametroDto> listaArea) {
        this.listaArea = listaArea;
    }
}
